import matplotlib.pyplot as plt
import numpy as np

# 绘制一个直线图
plt.plot([1, 4], [3, 15], "r-o")

# 保存图像
plt.savefig("example_1.png", dpi=300)
plt.savefig("example_2.jpg", dpi=300)

# 读取图像
# 图像在计算机中，其实是显示为 三维数组 的
img_1 = plt.imread("./example_1.png")
print(img_1.shape)  #输出(1440, 1920, 4)
img_2 = plt.imread("./example_2.jpg")
print(img_2.shape)  #输出(1440, 1920, 3)
"""
解释说明：
图像在计算机中存储为三维数组，其中
第一维度是 高度
第二维度是 宽度
第三维度是 通道数
什么是通道数呢？一般来说，RGB三原色就是三通道，计算机中常见的存储图像的格式为
png 无损压缩 文件大 支持透明和半透明
jpg 有损压缩 文件小 颜色丰富 不支持透明
gif 无损压缩 仅支持256色 支持透明和动画
bmp 无压缩(直接存储像素数据)   文件大大 画质最高 不支持透明
"""

# 显示图像
plt.subplot(121), plt.imshow(img_1), plt.axis("off")
plt.subplot(122), plt.imshow(img_2), plt.axis("off")

plt.show()


import matplotlib.pyplot as plt

fig = plt.figure("画布_1",
           (8, 6),
           dpi=100,
           facecolor="skyblue",
           edgecolor="skyblue")

ax = fig.add_subplot(121)
ax.plot([1, 4], [3, 16], "r-o")
ax.set_title("line plot")

ax = fig.add_subplot(122)
ax.scatter([1, 4], [3, 16])
ax.set_title("scatter plot")

fig.suptitle("line and scatter")

plt.show()
import matplotlib.pyplot as plt

fig = plt.figure("画布_1",
           (8, 6),
           dpi=100,
           facecolor="skyblue",
           edgecolor="skyblue")

ax = fig.add_subplot(121)
ax.plot([1, 4], [3, 16], "r-o")
ax.set_title("line plot")

ax = fig.add_subplot(122)
ax.scatter([1, 4], [3, 16])
ax.set_title("scatter plot")

fig.suptitle("line and scatter")

plt.show()
import matplotlib.pyplot as plt
import numpy as np

# 创建画布
fig = plt.figure("3D散点图")
# 创建子图对象，并设定为3D绘图
ax = fig.add_subplot(111, projection="3d")

# 准备数据
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)
sizes = 100*np.random.rand(50)
colors = np.random.rand(50)

# 绘制散点图
sc = ax.scatter(x, y, z, s=sizes, c=colors)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
ax.set_title("3D Scatter Plot")

# 通过循环，模型3D动画效果
for _ in range(20):
    # 给z添加一些抖动，模拟数据的偏移
    z = z + np.random.normal(0, 0.1, z.shape)
    # 在原图上更新数据
    sc._offsets3d = (x, y, z)

    # 如果说无动画效果，可以进行强制更新
    # fig.canvas.draw()

    # 稍微加一下暂停
    plt.pause(0.5)

plt.show()


import matplotlib.pyplot as plt
import numpy as np

# 定义损失函数
def loss_fn(x, y):
    return x ** 2 + y ** 2 + 1.5

# 创建数据
w1 = np.linspace(-1, 1, 100)
w2 = np.linspace(-1, 1, 100)
# 合并网格
ww1, ww2 = np.meshgrid(w1, w2)
# print(ww1.shape, ww2.shape)   # 输出(100, 100)
# 计算整个网格的损失值
loss = loss_fn(ww1, ww2)
# print(loss.shape)

# 创建画布
fig = plt.figure("3d曲面图和对应等高线图")
# 创建子图对象
ax1 = fig.add_subplot(121, projection="3d")
# 绘制3d曲面图
ax1.plot_surface(ww1, ww2, loss)

# 创建子图对象
ax2 = fig.add_subplot(122)
# 绘制等高线图
ax2.contour(ww1, ww2, loss)

plt.show()